package utilsvc

import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"fmt"
	"strconv"
)

// 定义一个固定长度的密钥和IV
const key = "zhi2024ji11ben26" // 16字节，用于AES-128
const iv = "1234567812345678"  // 16字节，AES块大小为16字节
// 用户ID加密函数
func EncryptUserId(userId uint) (string, error) {
	// 将用户ID转换为字符串，再转换为字节切片
	plainText := []byte(strconv.FormatUint(uint64(userId), 10))

	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return "", err
	}

	// 生成一个随机的IV
	ivBytes := []byte(iv)

	// 使用CBC模式
	mode := cipher.NewCBCEncrypter(block, ivBytes)

	// PKCS5Padding
	padding := block.BlockSize() - len(plainText)%block.BlockSize()
	padText := bytes.Repeat([]byte{byte(padding)}, padding)
	plainText = append(plainText, padText...)

	cipherText := make([]byte, len(plainText))
	mode.CryptBlocks(cipherText, plainText)

	// 将密文转换为Base64格式以确保可打印性
	return base64.StdEncoding.EncodeToString(cipherText), nil
}

// 用户ID解密函数
func DecryptUserId(cipherText string) (uint, error) {
	// 检查密文长度是否是块大小的整数倍
	blockSize := aes.BlockSize // AES 块大小为 16 字节
	if len(cipherText)%base64.StdEncoding.EncodedLen(blockSize) != 0 {
		return 0, fmt.Errorf("密文长度不是块大小的整数倍")
	}

	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		return 0, err
	}

	// 解码Base64格式的密文
	cipherBytes, _ := base64.StdEncoding.DecodeString(cipherText)

	// 使用CBC模式
	mode := cipher.NewCBCDecrypter(block, []byte(iv))

	plainText := make([]byte, len(cipherBytes))
	mode.CryptBlocks(plainText, cipherBytes)

	// 去除PKCS5填充
	padding := int(plainText[len(plainText)-1])
	plainText = plainText[:len(plainText)-padding]

	// 将字节切片转换为字符串，再转换为uint
	userIdStr := string(plainText)
	userId, err := strconv.ParseUint(userIdStr, 10, 64)
	if err != nil {
		return 0, err
	}
	return uint(userId), nil
}
